home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus 2004 #2 / Amiga Plus CD - 2004 - No. 02.iso / AmigaPlus / Tools / Development / AmigaTalk / user / Fraction.st < prev    next >
Text File  |  2004-01-31  |  4KB  |  159 lines

  1. " ------------------------------------------------------------- "
  2. " Fraction.st - Implementation of fraction number class for     "
  3. "               AmigaTalk.                                      "
  4. " ------------------------------------------------------------- "
  5.  
  6. Class Fraction :Magnitude ! ratio n d !
  7. [
  8.   new
  9.     n     <- Float new: 0.0.
  10.     d     <- Float new: 1.0.
  11.     ratio <- Float new: 0.0
  12. |
  13.   numerator
  14.     ^n
  15. |
  16.   denominator
  17.     ^d
  18. |
  19.   fraction
  20.     ^ratio
  21. |
  22.   asFloat
  23.     (d == 0.0)
  24.       ifTrue: [ <primitive 123 'Improper fraction (x / 0.0)!'>.
  25.                 ^ nil 
  26.               ].
  27.       
  28.     ^ratio <- (n / d)
  29. |
  30.   coerce: aNumber ! newFraction !
  31.     newFraction <- Fraction new.
  32.  
  33.     newFraction numerator:   aNumber.
  34.     newFraction denominator: 1.0.
  35.     newFraction fraction:    aNumber.
  36.  
  37.     ^ newFraction
  38. |
  39.   numerator: newNum
  40.     n <- newNum
  41. |
  42.   denominator: newDenom
  43.     d <- newDenom
  44. |
  45.   fraction: newFrac
  46.     ratio <- newFrac
  47. |
  48.   reciprocal ! temp !
  49.     (n == 0.0)
  50.       ifTrue: [ <primitive 123 'Reciprocal: Improper fraction (x / 0.0)!'>.
  51.                 ^ nil 
  52.               ].
  53.     temp <- n.
  54.     n    <- d.
  55.     d    <- temp.
  56.     ^ ratio <- (n / d)    
  57. |
  58.   + aNumber ! tn td nc !
  59.     (aNumber isKindOf: (self class))
  60.       ifFalse: [ nc <- self coerce: aNumber ]
  61.       ifTrue:  [ nc <- aNumber              ].
  62.  
  63.     td           <- d  * (nc denominator).
  64.     tn           <- n  * (nc denominator).
  65.     nc numerator:   d  * (nc numerator).
  66.     n            <- tn + (nc numerator).
  67.     d            <- td.
  68.     ^ ratio <- (n / d)
  69. |
  70.   - aNumber ! tn td nc !
  71.     (aNumber isKindOf: (self class))
  72.       ifFalse: [ nc <- self coerce: aNumber ]
  73.       ifTrue:  [ nc <- aNumber              ].
  74.  
  75.     td                <- d  * (nc denominator).
  76.     tn                <- n  * (nc denominator).
  77.     aNumber numerator:   d  * (nc numerator).
  78.     n                 <- tn - (nc numerator).
  79.     d                 <- td.
  80.     ^ ratio <- (n / d)
  81. |
  82.   * aNumber ! nc !
  83.  
  84.     (aNumber isKindOf: (self class))
  85.       ifFalse: [ nc <- self coerce: aNumber ]
  86.       ifTrue:  [ nc <- aNumber              ].
  87.  
  88.     n <- n * (nc numerator).
  89.     d <- d * (nc denominator).
  90.     ^ ratio <- (n / d)
  91. |
  92.   / aNumber ! nf !
  93.  
  94.     (aNumber isKindOf: (self class))
  95.       ifFalse: [ nf <- self coerce: aNumber ]
  96.       ifTrue:  [ nf <- aNumber              ].
  97.    
  98.     ^ self * (nf reciprocal)
  99. |
  100.   printString ! str !
  101.     (<primitive 78 n>, ' / ', <primitive 78 d>) print
  102. |
  103.   == aNumber ! nc !
  104.  
  105.     (aNumber isKindOf: (self class))
  106.       ifFalse: [ nc <- self coerce: aNumber ]
  107.       ifTrue:  [ nc <- aNumber              ].
  108.  
  109.     ((n == nc numerator) & (d == nc denominator))
  110.       ifTrue:  [ ^ true  ]
  111.       ifFalse: [ ^ false ]
  112. |
  113.   ~= aNumber ! nc !
  114.  
  115.     (aNumber isKindOf: (self class))
  116.       ifFalse: [ nc <- self coerce: aNumber ]
  117.       ifTrue:  [ nc <- aNumber              ].
  118.  
  119.     ((n ~= nc numerator) & (d ~= nc denominator))
  120.       ifTrue:  [ ^ true  ]
  121.       ifFalse: [ ^ false ]
  122. |
  123.   <  aNumber ! nc !
  124.     (aNumber isKindOf: (self class))
  125.       ifFalse: [ nc <- self coerce: aNumber ]
  126.       ifTrue:  [ nc <- aNumber              ].
  127.  
  128.     (ratio < nc fraction)
  129.       ifTrue:  [ ^ true  ]
  130.       ifFalse: [ ^ false ]
  131. |
  132.   >  aNumber ! nc !
  133.     (aNumber isKindOf: (self class))
  134.       ifFalse: [ nc <- self coerce: aNumber ]
  135.       ifTrue:  [ nc <- aNumber              ].
  136.  
  137.     (ratio > nc fraction)
  138.       ifTrue:  [ ^ true  ]
  139.       ifFalse: [ ^ false ]
  140. |
  141.   <= aNumber ! nc !
  142.     (aNumber isKindOf: (self class))
  143.       ifFalse: [ nc <- self coerce: aNumber ]
  144.       ifTrue:  [ nc <- aNumber              ].
  145.  
  146.     (ratio <= nc fraction)
  147.       ifTrue:  [ ^ true  ]
  148.       ifFalse: [ ^ false ]
  149. |
  150.   >= aNumber ! nc !
  151.     (aNumber isKindOf: (self class))
  152.       ifFalse: [ nc <- self coerce: aNumber ]
  153.       ifTrue:  [ nc <- aNumber              ].
  154.  
  155.     (ratio >= nc fraction)
  156.       ifTrue:  [ ^ true  ]
  157.       ifFalse: [ ^ false ]
  158. ]
  159.